package gui.edit_objects;

import gui.del_object.Del_Adresse;
import gui.del_object.Del_Connaissance;
import gui.del_object.Del_Telephone;
import gui.list_objects.result_recherche_activite_model;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import bdd_handler.ActiviteDAO;
import bdd_handler.AdresseDAO;
import bdd_handler.PersonneDAO;
import bdd_handler.TelephoneDAO;
import bdd_handler.bdd;

import objects.Adresse;
import objects.Personne;
import objects.Telephone;


public class Edit_Personne extends JFrame implements ActionListener, ListSelectionListener, ComponentListener {

	private static final long serialVersionUID = 1L;

	private JFrame parent;
	private Personne p;
	private boolean mknew;

	private ActiviteDAO aDAO;
	private AdresseDAO adrDAO;
	private TelephoneDAO tDAO;
	private PersonneDAO perDAO;

	private JButton valider;
	private JButton annuler;

	private JTextField personne_nom;
	private JTextField personne_prenom;
	private JTextField personne_date_naissance;

	private JTable adresses, telephones, connaissances, activites;

	private ModelAdresses aModel;
	private ModelConnaissances cModel;
	private ModelTelephones tModel;
	private result_recherche_activite_model actModel;

	private JButton new_adresse, edit_adresse, del_adresse;
	private JButton new_telephone, edit_telephone, del_telephone;
	private JButton new_connaissance, voir_connaissance, del_connaissance;


	public Edit_Personne(JFrame parent, Personne personne){
		//recuperation de la fenetre parente
		this.addComponentListener(this);
		this.parent=parent;
		this.parent.setVisible(false);

		//construction de la fenetre
		this.p=personne;
		if(p.getId_personne()==-1)
			mknew=true;
		else
			mknew=false;
		if(mknew)
			this.setTitle("Nouvelle Personne");
		else
			this.setTitle("Editer Personne");
		this.setSize(620,700);
		this.setResizable(false);
		JPanel pan=new JPanel();
		pan.setLayout(null);
		this.setContentPane(pan);

		//creation des DAOs
		bdd db=new bdd();
		aDAO=new ActiviteDAO(db.getConnection());
		adrDAO=new AdresseDAO(db.getConnection());
		tDAO=new TelephoneDAO(db.getConnection());
		perDAO=new PersonneDAO(db.getConnection());

		//creation objets internes
		JLabel lbl_nom=new JLabel("Nom:");
		personne_nom=new JTextField(p.getNom());
		JLabel lbl_prenom=new JLabel("Prénom:");
		personne_prenom=new JTextField(p.getPrenom());
		JLabel lbl_date_naissance=new JLabel("date de naissance");
		personne_date_naissance=new JTextField(new SimpleDateFormat("yyyy-MM-dd").format(p.getDateNaissance()));
		
		valider=new JButton("enregistrer");
		valider.addActionListener(this);
		annuler=new JButton("annuler");
		annuler.addActionListener(this);
		
		aModel=new ModelAdresses(adrDAO.findByPersonne(this.p));
		cModel=new ModelConnaissances(perDAO.getConnaissances(this.p));
		tModel=new ModelTelephones(tDAO.findByPersonne(this.p));
		actModel=new result_recherche_activite_model(aDAO.findAll());
		adresses=new JTable(aModel);
		adresses.getTableHeader().setReorderingAllowed(false);
		adresses.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		adresses.getSelectionModel().addListSelectionListener(this);
		telephones=new JTable(tModel);
		telephones.getTableHeader().setReorderingAllowed(false);
		telephones.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		telephones.getSelectionModel().addListSelectionListener(this);
		connaissances=new JTable(cModel);
		connaissances.getTableHeader().setReorderingAllowed(false);
		connaissances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		connaissances.getSelectionModel().addListSelectionListener(this);
		activites=new JTable(actModel);
		activites.getTableHeader().setReorderingAllowed(false);
		activites.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		activites.getSelectionModel().addListSelectionListener(this);
		activites.getSelectionModel().addSelectionInterval(actModel.getLineOfId(p.getActivite().getId_activite()),actModel.getLineOfId(p.getActivite().getId_activite()));
		JScrollPane jsp_adresses=new JScrollPane(adresses);
		JScrollPane jsp_telephones=new JScrollPane(telephones);
		JScrollPane jsp_connaissances=new JScrollPane(connaissances);
		JScrollPane jsp_activites=new JScrollPane(activites);

		//bloc adresse
		new_adresse=new JButton("nouvelle adresse");
		new_adresse.addActionListener(this);		
		edit_adresse=new JButton("voir/éditer adresse");
		edit_adresse.addActionListener(this);
		del_adresse=new JButton("supprimer adresse");
		del_adresse.addActionListener(this);

		new_telephone=new JButton("nouveau téléphone");
		new_telephone.addActionListener(this);		
		edit_telephone=new JButton("voir/éditer téléphone");
		edit_telephone.addActionListener(this);
		del_telephone=new JButton("supprimer téléphone");
		del_telephone.addActionListener(this);

		new_connaissance=new JButton("nouvelle connaissance");
		new_connaissance.addActionListener(this);		
		voir_connaissance=new JButton("voir connaissance");
		voir_connaissance.addActionListener(this);
		del_connaissance=new JButton("supprimer connaissance");
		del_connaissance.addActionListener(this);

		//placer les objets
		pan.add(lbl_nom);
		lbl_nom.setBounds(10,10,200,20);
		pan.add(personne_nom);
		personne_nom.setBounds(220,10,200,20);
		pan.add(lbl_prenom);
		lbl_prenom.setBounds(10, 40, 200, 20);
		pan.add(personne_prenom);
		personne_prenom.setBounds(220, 40, 200, 20 );
		pan.add(lbl_date_naissance);
		lbl_date_naissance.setBounds(10, 70, 200, 20);
		pan.add(personne_date_naissance);
		personne_date_naissance.setBounds(220, 70, 200, 20);

		pan.add(jsp_adresses);
		jsp_adresses.setBounds(10, 100, 200, 140);
		pan.add(new_adresse);
		new_adresse.setBounds(220, 100, 200, 30);
		pan.add(edit_adresse);
		edit_adresse.setBounds(220, 140, 200, 30);
		pan.add(del_adresse);
		del_adresse.setBounds(220, 180, 200, 30);

		pan.add(jsp_telephones);
		jsp_telephones.setBounds(10, 250, 200, 140);	
		pan.add(new_telephone);
		new_telephone.setBounds(220, 250, 200, 30);
		pan.add(edit_telephone);
		edit_telephone.setBounds(220, 290, 200, 30);
		pan.add(del_telephone);
		del_telephone.setBounds(220, 330, 200, 30);

		pan.add(jsp_connaissances);
		jsp_connaissances.setBounds(10, 400, 200, 140);
		pan.add(new_connaissance);
		new_connaissance.setBounds(220, 400, 200, 30);
		pan.add(voir_connaissance);
		voir_connaissance.setBounds(220, 440, 200, 30);
		pan.add(del_connaissance);
		del_connaissance.setBounds(220, 480, 200, 30);

		pan.add(jsp_activites);
		jsp_activites.setBounds(10, 520, 200, 140);
		
		pan.add(valider);
		valider.setBounds(220, 630, 190, 30);
		pan.add(annuler);
		annuler.setBounds(420, 630, 190, 30);
		
		//action fermeture fenetre
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		this.addWindowListener(
				new WindowAdapter(){
					public void windowClosing(WindowEvent e){
						close();

					}
				}
				);
		//afficher la fenetre
		this.setVisible(true);

	}

	private void close(){
		this.parent.setVisible(true);
		this.dispose();
	}

	private boolean check_personne_ok()
	{
		if(!mknew)
			return true;
		if(personne_nom.getText().equals(""))
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "vous devez dabord renseigner le nom de la personne.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		if(personne_prenom.getText().equals(""))
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "vous devez dabord renseigner le prénom de la personne.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		if(personne_date_naissance.getText().equals(""))
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "vous devez dabord renseigner la date de naissance de la personne.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		if(!personne_date_naissance.getText().matches("^[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]$"))
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "la date de naissance doit être dans le format yyyy-mm-dd et être valide.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		Date date;
		try
		{
			int y,m,d;
			y=Integer.parseInt(personne_date_naissance.getText().substring(0, 4));
			m=Integer.parseInt(personne_date_naissance.getText().substring(5, 7));
			d=Integer.parseInt(personne_date_naissance.getText().substring(8, 10));
			date = new Date(y, m, d);
		}
		catch(Exception e)
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "cette date n'existe pas.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		p.setNom(personne_nom.getText());
		p.setPrenom(personne_prenom.getText());
		p.setDateNaissance(date);
		p.setActivite(aDAO.find((int)actModel.getValueAt(activites.getSelectedRow(), 1)));
		int id=perDAO.create(p);
		if(mknew)
		p.setId_personne(id);
		this.mknew=false;
		return true;
	}
	public void actionPerformed(ActionEvent e) {
		Object source=e.getSource();
		if(source==new_adresse && check_personne_ok())
		{
			new Edit_Adresse(this, new Adresse(-1, p, "nouvelle adresse", 0, 0, "", null, "", null));
		}
		if(source==edit_adresse && check_personne_ok())
		{
			if(adresses.getSelectedRow()<0 || (int)aModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune adresse n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Adresse(this, adrDAO.find((int)aModel.getValueAt(adresses.getSelectedRow(), 1)));
		}
		if(source==del_adresse && check_personne_ok())
		{
			if(adresses.getSelectedRow()<0 || (int)aModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune adresse n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Adresse(this, adrDAO.find((int)aModel.getValueAt(adresses.getSelectedRow(), 1)));
		}
		if(source==new_telephone && check_personne_ok())
		{
			new Edit_Telephone(this, new Telephone(-1, p,"nouveau téléphone", ""));
		}
		if(source==edit_telephone && check_personne_ok())
		{
			if(telephones.getSelectedRow()<0 || (int)tModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun téléphone n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Telephone(this, tDAO.find((int)tModel.getValueAt(telephones.getSelectedRow(), 1)));
		}
		if(source==del_telephone && check_personne_ok())
		{
			if(telephones.getSelectedRow()<0 || (int)tModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucun téléphone n'est séléctionné.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Telephone(this, tDAO.find((int)tModel.getValueAt(telephones.getSelectedRow(), 1)));
		}
		if(source==new_connaissance && check_personne_ok())
		{
			new New_Connaissance(this, p);
		}
		if(source==voir_connaissance && check_personne_ok())
		{
			if(connaissances.getSelectedRow()<0 || (int)cModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune connaissance n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Personne(this,perDAO.find((int)cModel.getValueAt(connaissances.getSelectedRow(), 1)));
		}
		if(source==del_connaissance && check_personne_ok())
		{
			if(connaissances.getSelectedRow()<0 || (int)cModel.getValueAt(0, 1)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune connaissance n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Connaissance(this,p,perDAO.find((int)cModel.getValueAt(connaissances.getSelectedRow(), 1)));
		}
		
		if(source==valider)
		{
			check_personne_ok();
		}
		
		if(source==annuler)
		{
			close();
		}

	}

	@Override
	public void valueChanged( ListSelectionEvent e)
	{

	}
	@Override
	public void componentShown(ComponentEvent e) {
		update_tabs();
	}

	@Override
	public void componentHidden(ComponentEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void componentMoved(ComponentEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void componentResized(ComponentEvent e) {
		// TODO Auto-generated method stub

	}

	private void update_tabs(){
		aModel.setNewData(adrDAO.findByPersonne(p));
		cModel.setNewData(perDAO.getConnaissances(p));
		tModel.setNewData(tDAO.findByPersonne(p));
		adresses.setModel(aModel);
		connaissances.setModel(cModel);
		telephones.setModel(tModel);
		adresses.revalidate();
		adresses.repaint();
		connaissances.revalidate();
		connaissances.repaint();
		telephones.revalidate();
		telephones.repaint();
	}

}
